home *** CD-ROM | disk | FTP | other *** search
- /*
- *
- * Finger support...
- *
- * Finger client routines. Written by Michael T. Horne - KA7AXD.
- * Copyright 1988 by Michael T. Horne, All Rights Reserved.
- * Permission granted for non-commercial use and copying, provided
- * that this notice is retained.
- *
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "dbox.h"
- #include "werr.h"
- #include "global.h"
- #include "mbuf.h"
- #include "timer.h"
- #include "internet.h"
- #include "icmp.h"
- #include "netuser.h"
- #include "tcp.h"
- #include "finger.h"
- #include "session.h"
- #include "misc.h"
- #include "domain.h"
-
- #define FINGER_Connect 0
- #define FINGER_User 1
- #define FINGER_Host 2
-
- static int finger(int32, char *, char *, char *, struct session *);
- static int finger_error(char *, char *, struct session *);
-
- extern char badhost[],
- hostname[],
- nospace[];
-
- void start_finger(void)
- {
- struct session *session;
- char Host[256];
- char User[56];
- char buffer[80];
- dbox d;
-
- if ((d = dbox_new("FINGER")) == NULL)
- return;
-
- dbox_setfield(d, FINGER_User, "");
- dbox_setfield(d, FINGER_Host, "");
- dbox_show(d);
-
- if (dbox_fillin(d) == FINGER_Connect)
- {
- dbox_getfield(d, FINGER_User, User, 50);
- dbox_getfield(d, FINGER_Host, Host, 255);
-
- /* Allocate a session descriptor */
- sprintf(buffer, "FINGER - %.60s", Host);
- if ((session = newsession(buffer)) == NULLSESSION)
- {
- werr(0, "Too many sessions");
- return;
- }
-
- session->name = strdup(Host);
- session->type = RESOLVING;
- session->parse = NULLVFP;
-
- sprintf(buffer, "Resolving %.60s ...\n", Host);
- Window_Write(session->window, buffer, strlen(buffer));
-
- resolve_a(Host, User, NULLCHAR, session, finger, finger_error);
- }
-
- dbox_dispose(&d);
- }
-
- static int finger_error(char *host, char *message, struct session *s)
- {
- char buffer[80];
-
- sprintf(buffer, "Cannot FINGER %s - %s\n", host, message);
- Window_Write(s->window, buffer, strlen(buffer));
-
- detachsession(s);
-
- return 0;
- }
-
- static int finger(int32 address, char *host, char *user, char *arg2, struct session *s)
- {
- char buffer[80];
- struct tcb *tcb;
- struct socket lsocket, fsocket;
- struct finger *finger;
-
- host = host;
- arg2 = arg2;
-
- lsocket.address = ip_addr;
- lsocket.port = lport++;
-
- fsocket.address = address;
- fsocket.port = FINGER_PORT;
-
- s->type = FINGER;
- s->addr = fsocket.address;
- s->parse = NULLVFP;
- s->echo = 0;
- s->raw = 0;
-
- if ((finger = alloc_finger()) == NULLFING) {
- Window_Write(s->window, nospace, strlen(nospace));
- detachsession(s);
- return(1);
- }
-
- strcpy(buffer, user);
- strcat(buffer, "\r\n");
- finger->user = strdup(buffer);
- s->cb.finger = finger;
- finger->session = s;
-
- sprintf(buffer, "Trying [%s] ...\n", inet_ntoa(address));
- Window_Write(s->window, buffer, strlen(buffer));
-
- tcb = open_tcp(&lsocket, &fsocket, TCP_ACTIVE, 0,
- (void(*)())fingcli_rcv, NULLVFP, (void(*)())f_state, 0, (char *)finger);
-
- finger->tcb = tcb;
- tcb->user = (char *)finger;
- return 0;
- }
-
- /*
- * Allocate a finger structure for the new session
- */
- struct finger *alloc_finger(void)
- {
- struct finger *tmp;
-
- if ((tmp = (struct finger *) malloc(sizeof(struct finger))) == NULLFING)
- return(NULLFING);
- tmp->session = NULLSESSION;
- tmp->user = (char *) NULL;
- return(tmp);
- }
-
- /*
- * Free a finger structure
- */
- int free_finger(struct finger *finger)
- {
- if (finger != NULLFING) {
- if (finger->session != NULLSESSION)
- detachsession(finger->session);
- if (finger->user != (char *) NULL)
- free(finger->user);
- free(finger);
- }
- return 0;
- }
-
- /* Finger receiver upcall routine */
- void fingcli_rcv(register struct tcb *tcb, int16 cnt)
- {
- struct finger *finger;
- struct mbuf *bp;
- register char *buf;
- register char *s;
- char *line;
-
- /* Make sure it's a valid finger session */
- if ((finger = (struct finger *)tcb->user) == NULLFING)
- return;
-
- if (recv_tcp(tcb, &bp, cnt) > 0) {
- if ((line = s = malloc(len_mbuf(bp) + 1)) == NULL)
- {
- Window_Write(finger->session->window, "Out of memory in FINGCLI\n", 25);
- free_p(bp);
- return;
- }
- while (bp != NULLBUF) {
- buf = bp->data;
- while(bp->cnt--) {
- switch(*buf) {
- case '\012': /* ignore LF */
- case '\032': /* NO ^Z's! */
- break;
- case '\015':
- *s++ = '\n';
- break;
- default:
- *s++ = *buf;
- break;
- }
- buf++;
- }
- bp = free_mbuf(bp);
- }
- *s = '\0';
- Window_Write(finger->session->window, line, strlen(line));
- free(line);
- }
- }
-
- /* State change upcall routine */
- void f_state(register struct tcb *tcb, char old, char new)
- {
- struct finger *finger;
- extern char *tcpstates[];
- extern char *reasons[];
- extern char *unreach[];
- extern char *exceed[];
- struct mbuf *bp;
- char buffer[50];
-
- old = old;
-
- finger = (struct finger *)tcb->user;
-
- switch(new){
-
- case CLOSE_WAIT:
- sprintf(buffer, "%s\n",tcpstates[new]);
- Window_Write(finger->session->window, buffer, strlen(buffer));
- close_tcp(tcb);
- break;
- case CLOSED: /* finish up */
- sprintf(buffer, "%s (%s", tcpstates[new], reasons[tcb->reason]);
- Window_Write(finger->session->window, buffer, strlen(buffer));
- if (tcb->reason == NETWORK){
- switch(tcb->type){
- case DEST_UNREACH:
- sprintf(buffer,": %s unreachable",unreach[tcb->code]);
- Window_Write(finger->session->window, buffer, strlen(buffer));
- break;
- case TIME_EXCEED:
- sprintf(buffer,": %s time exceeded",exceed[tcb->code]);
- Window_Write(finger->session->window, buffer, strlen(buffer));
- break;
- }
- }
- Window_Write(finger->session->window,")\n",2);
- if(finger != NULLFING) free_finger(finger);
- del_tcp(tcb);
- break;
- case ESTABLISHED:
- sprintf(buffer,"%s\n",tcpstates[new]);
- Window_Write(finger->session->window,buffer,strlen(buffer));
- sprintf(buffer, "[%s]\n", finger->session->name);
- Window_Write(finger->session->window,buffer,strlen(buffer));
- bp = qdata(finger->user, (int16)strlen(finger->user));
- send_tcp(tcb, bp);
- break;
- default:
- sprintf(buffer,"%s\n",tcpstates[new]);
- Window_Write(finger->session->window,buffer,strlen(buffer));
- break;
- }
- }
-
-